package GameFrame

import (
	"github.com/hajimehoshi/ebiten/v2"
	"log"
	"myGame/src/model"
	"myGame/src/tool"
	"time"
)

type Input struct {
	Msg            string
	lastBulletTime time.Time
	lastUpTime     time.Time
}

var fly bool
var fall bool

func (i *Input) Update(g *Game) {
	//人物向左向右行走
	if ebiten.IsKeyPressed(ebiten.KeyA) {
		g.realm.Dir = 0
		g.realm.X -= (g.Cfg.RealmSpeedFactor + g.Cfg.ObstacleSpeed)
		if g.realm.X < -float64(g.realm.Width[g.realm.State])/2 {
			g.realm.X = -float64(g.realm.Width[g.realm.State]) / 2
		}
	} else if ebiten.IsKeyPressed(ebiten.KeyD) {
		g.realm.Dir = 1
		g.realm.X += g.Cfg.RealmSpeedFactor
		if g.realm.X > float64(g.Cfg.ScreenWidth-g.realm.Width[g.realm.State]/2) {
			g.realm.X = float64(g.Cfg.ScreenWidth - g.realm.Width[g.realm.State]/2)
		}
	}

	//给人物是否是在下蹲状态，这样等下的攻击做出相应变化
	if ebiten.IsKeyPressed(ebiten.KeyS) && g.realm.Y[g.realm.State] == 340 {
		g.realm.State = 1
		//g.realm.Y[g.realm.State] = 400
	}
	//给人物如果在空中飞翔的时候，处于下落状态，让他也可以下蹲
	if ebiten.IsKeyPressed(ebiten.KeyS) && g.Cfg.RealmFlySpeed < -5 {
		g.realm.State = 1
		g.realm.Y[0] = float64(g.Cfg.ScreenHeight - g.realm.Height[0] - 130)
		g.realm.Y[g.realm.State] = float64(g.Cfg.ScreenHeight - g.realm.Height[g.realm.State] - 100)
	}
	//在下蹲键松开的时候，让人物可以变回站立的状态
	//如果人物蹲下时没摁S  或者  人物是蹲着状态单，人物的脚未着地
	if g.realm.State == 1 && !ebiten.IsKeyPressed(ebiten.KeyS) ||
		g.realm.Y[g.realm.State] < 500 && g.realm.State == 1 {
		g.realm.State = 0
		//g.realm.Y[g.realm.State] = float64(g.realm.Height[g.realm.State])
	}
	//人物跳跃动作使用   //实在不知道为什么，在这里我需要在input里面也重新吧g.realm.State 的值也给变成 0
	//可是实际上我在蹲的里面已经在其他地方修改过了，但是这里呢？  我不修改它就会有bug，如果蹲着状态起跳，那么之后就蹲不了了
	if ebiten.IsKeyPressed(ebiten.KeyW) && g.realm.Y[g.realm.State] >= 340 {
		g.realm.State = 0
		g.Cfg.RealmFlySpeed = 20
		fly = true
		//播放音效
		if err := tool.Play2music.Rewind(); err != nil {
			log.Fatal(err)
		}
		tool.Play2music.Play()
	}
	if fly {
		g.realm.Y[g.realm.State] -= g.Cfg.RealmFlySpeed
		g.Cfg.RealmFlySpeed -= 0.8
	}

	//这里是一些当没有摁上升键盘的时候，又会匀速下落的代码，没什么用了
	if g.realm.Y[g.realm.State] > float64(g.Cfg.ScreenHeight-g.realm.Height[g.realm.State]-130) && g.realm.State == 0 {
		fly = false
		g.realm.Y[g.realm.State] = float64(g.Cfg.ScreenHeight - g.realm.Height[g.realm.State] - 130)
	}
	if g.realm.Y[g.realm.State] > float64(g.Cfg.ScreenHeight-g.realm.Height[g.realm.State]-100) && g.realm.State == 1 {
		fly = false
		g.realm.Y[g.realm.State] = float64(g.Cfg.ScreenHeight - g.realm.Height[g.realm.State] - 100)
	}
	//}
	//人物攻击方式，目前只有远攻
	if ebiten.IsKeyPressed(ebiten.KeySpace) {
		//fmt.Println(i.lastBulletTime)
		if len(g.bullets) < g.Cfg.MaxBulletNum &&
			time.Now().Sub(i.lastBulletTime).Milliseconds() > g.Cfg.BulletInterval {
			bullet := model.NewBullet(g.Cfg, g.realm)
			g.addBullet(bullet)
			i.lastBulletTime = time.Now()

			//播放音效
			if err := tool.Play3music.Rewind(); err != nil {
				log.Fatal(err)
			}
			tool.Play3music.Play()
		}
	}
}
func (i *Input) IskeyPressed() bool {
	if ebiten.IsKeyPressed(ebiten.KeySpace) || ebiten.IsMouseButtonPressed(ebiten.MouseButtonLeft) {
		return true
	}
	return false
}
